package sparrowGui.components.item
{
	import flash.display.DisplayObject;
	
	import sparrowGui.i.IItem;
	import sparrowGui.i.IItemFactory;
	import sparrowGui.uiStyle.UIStyleMgr;

	/**
	 * 组件子项创建工厂
	 * @author Pelephone
	 * @website http://cnblogs.com/pelephone
	 */
	public class ItemFactory implements IItemFactory
	{
		private var _itemClass:Class;
		/**
		 * 缓存项
		 */
		private var cacheItemSize:int;
		/**
		 * 项名字，用于从UIMgr上面找默认样式
		 */
		private var _itemUI:Object;
		/**
		 * 缓存工具
		 */
//		private var cacheTool:ClassLinkCache;
		
		/**
		 * 构造项创建工厂
		 * @param itemClz	项组件类	必须是SItem子类
		 * @param itemSkin	项皮肤名字，对应UIMgr上面的样式,也可以是显示对象class
		 */
		public function ItemFactory(itemClz:Class,itemSkin:Object="ListItem")
		{
			this.itemClass = itemClz;
			this._itemUI = itemSkin;
			
//			if(cacheItemNum>=0)
//				cacheTool = new ClassLinkCache(cacheItemNum);
		}
		
		public function createNewItem(uiVars:DisplayObject=null) : IItem
		{
			uiVars = (uiVars!=null)?uiVars:createNewItemSkin();
			return new _itemClass(uiVars);
		}
		
		/**
		 * 生成项皮肤
		 * @return 
		 */
		public function createNewItemSkin():DisplayObject
		{
			if(_itemUI is Class)
				return new _itemUI();
			else if(_itemUI is String)
				return UIStyleMgr.getIns().createSkinUI(String(_itemUI));
			else
				return null;
		}

		/**
		 * 生成项的类，必须是继承SItem的类
		 
		public function get itemClass():Class
		{
			return _itemClass;
		}*/
		
		/**
		 * 生成项的类，必须是继承SItem的类
		 */
		public function set itemClass(value:Class):void
		{
			_itemClass = value;
		}
		
		public function get itemClass():Class
		{
			return _itemClass;
		}

		/**
		 * 生成项皮肤的类，必须是继承SItem的类
		 
		public function get itemSkinClass():Class
		{
			return _itemUI as Class;
		}*/
		
		/**
		 * 生成项皮肤的类，必须是继承DisplayObject的类(会把set itemSkinName覆盖)
		 */
		public function set itemSkinClass(value:Class):void
		{
			_itemUI = value;
		}
		
		/**
		 * 生成项皮肤绑在UIMgr上面的样式名(会把set itemSkinClass覆盖)
		 */
		public function set itemSkinName(value:String):void
		{
			_itemUI = value;
		}
		
		public function get itemSkinClass():Class
		{
			return _itemUI as Class;
		}
		
		/**
		 * 回收处理项(后期可以在这里添加缓存处理的逻辑)
		 * @param item
		 */
		public function disposeItem(item:IItem):void
		{
			item.dispose();
//			item.removeSkinFromParent();
		}
		
		/**
		 * 回收处理项皮肤(后期可以在这里添加缓存处理的逻辑)
		 * @param item
		 */
		public function disposeItemSkin(skin:DisplayObject):void
		{
			skin.parent.removeChild(skin);
		}
	}
}